Estado de las rampas de CABA en el año 2016 ¶
Índice¶
¿Qué queremos obtener con este análisis?¶
- Mostrar los lugares donde están ubicadas las rampas en este relevamiento de CABA.
- Diferenciar las rampas finlizadas o en construcción.
¿Con qué datos vamos a trabajar?¶
- Dataset: rampas de accesibilidad - Relevamiento 2016 (CABA) descarga csv
- Archivo con la información geográfica de las comunas de CABA descarga shapefile
Preparando la información ¶
En el siguiente bloque importamos las librerías necesarias.
Primero importamos pandas, esto nos permitirá usar las funciones que provee, es costumbre renombrarla como pd y el módulo geopandas, que nos permitirá mostrar la información geográficaa.
import pandas as pd
import geopandas as gpd
También el módulo pyplot de matplotlib normalmente abreviado como plt y os.path para acceder a los distintos archivos.
import matplotlib.pyplot as plt
import os.path
Definimos los datasets y el path a utilizar.
dir_datasets = "datasets"
comunas_caba_shp = "comunas.shp"
rampas_relevamiento_2016 = "rampas-de-accesibilidad-relevamiento-2016.csv"
path_datasets = os.path.join(os.getcwd(), dir_datasets)
¿Qué contiene el archivo de información geográfica (comunas.shp)?¶
Leemos la información del archivo que contiene la información de las comunas de CABA (shape) utilizando el metodo read_file() de geopandas asignándolo a la variable comunas.
comunas = gpd.read_file(os.path.join(path_datasets, comunas_caba_shp))
¿Qué contiene esta variable?¿De qué tipo es?
type(comunas)
geopandas.geodataframe.GeoDataFrame
La variable comunas es lo que se conoce como un GeoDataFrame.
Vemos parte del contenido del GeoDataFrame mediante el metodo head().
comunas.head()
ID | OBJETO | COMUNAS | BARRIOS | PERIMETRO | AREA | geometry | |
---|---|---|---|---|---|---|---|
0 | 1 | LIMITE COMUNAL | 2.0 | RECOLETA | 21452.838648 | 6.317265e+06 | POLYGON ((-58.38000 -34.57002, -58.38002 -34.5... |
1 | 3 | LIMITE COMUNAL | 6.0 | CABALLITO | 10990.964471 | 6.851029e+06 | POLYGON ((-58.43061 -34.60705, -58.43056 -34.6... |
2 | 6 | LIMITE COMUNAL | 10.0 | FLORESTA - MONTE CASTRO - VELEZ SARSFIELD - VE... | 18332.037457 | 1.265656e+07 | POLYGON ((-58.48834 -34.62016, -58.48820 -34.6... |
3 | 7 | LIMITE COMUNAL | 11.0 | VILLA DEL PARQUE - VILLA DEVOTO - VILLA GRAL.... | 19987.696155 | 1.412004e+07 | POLYGON ((-58.49838 -34.59637, -58.49718 -34.5... |
4 | 8 | LIMITE COMUNAL | 12.0 | COGHLAN - SAAVEDRA - VILLA PUEYRREDON - VILLA ... | 17232.189372 | 1.557093e+07 | POLYGON ((-58.50331 -34.59386, -58.50347 -34.5... |
La columna geometry contiene la información geográfica de cada una de las comunas como tipo de geometría polígono.
Graficamos ¶
Para poder graficar el mapa, utilizamos el metodo plot() que recibe como parámetro las dimensiones finales de la imagen el color de los polígonos a utilizar y el color de los bordes de cada polígono.
comunas.plot(figsize=(10,10), color='beige',edgecolor='black')
<AxesSubplot:>
Desafío 1:¶
Modificar los colores del mapa. Podemos usar lo siguiente:
- Tabla de colores: https://matplotlib.org/stable/gallery/color/named_colors.html
Como podemos observar, el mapa anterior no nos brinda el nombre de cada una de las comunas.
Agregamos algunos datos al gráfico ¶
Para poder subsanar el problema debemos trabajar un poco el GeoDataFrame realizando los siguientes pasos:
- Vamos a incluir el nombree de la comuna: para esto creamos una nueva columna de tipo POINT. Este dato es importante ya que es en este punto, calculado con el método representative_point(), donde se va a escribir el nombre de la comuna sobre el mapa.
comunas['coords'] = comunas['geometry'].apply(lambda x: x.representative_point().coords[:])
- Dado que el paso anterior nos devuelve una GeoSerie debemos quedarnos con el punto generado para cada registro del GeoDataFrame.
comunas['coords'] = [coords[0] for coords in comunas['coords']]
- Por último, creamos un campo llamado nombre_comuna el cual completamos, para cada registro del GeoDataFrame, con la concatenación del string 'Comuna ' mas el dato contenido en la columna COMUNAS (es en esta columna donde se encuentra el número de comuna).
comunas['nombre_comuna'] = comunas.apply(lambda x: 'Comuna ' + str(int(x['COMUNAS'])), axis=1)
Ahora podemos volver a dibujar el mapa esta vez trabajando un poco con la libreria matplotlib para poder informar los nombres de las comunas sobre el mismo.
fig, ax = plt.subplots(figsize = (10,10))
comunas.plot(ax=ax, color='beige', edgecolor='black')
for idx, row in comunas.iterrows():
plt.annotate(text=row['nombre_comuna'], xy=row['coords'], horizontalalignment='center', color='blue')
Desafío 2:¶
Modificar los colores y la forma en que se muestra el texto con el nombre de la comuna.
Leemos el dataset de las rampas de CABA, este archivo contiene la latitud y la longitud de la ubicación en el mapa para cada una de las rampas. Su sistemas de refrencia de coordenadas es el EPSG: 4326. Para leer el dataset utilizamos el metodo read_csv() de Pandas
rampas_2016 = pd.read_csv(os.path.join(path_datasets, rampas_relevamiento_2016), delimiter=';')
Vemos parte del contenido del dataset.
rampas_2016.head()
X | Y | ID | MES | SEMANA | ZONA | CALLE | ALTURA | ESTADO | DOM_NORMA | DOM_GEO | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | -58.401517 | -34.613463 | 1 | AGOSTO | 1 AL 6 | 2 Y 3 | ALBERTI | 315.0 | FINALIZADO | ALBERTI 315 | 315 ALBERTI |
1 | -58.403174 | -34.598833 | 2 | AGOSTO | 1 AL 6 | 2 Y 3 | CORDOBA AV | 2554.0 | FINALIZADO | CORDOBA AV. 2554 | 2554 CORDOBA AV. |
2 | -58.394427 | -34.618371 | 3 | AGOSTO | 1 AL 6 | 2 Y 3 | INDEPENDENCIA AV | 1998.0 | FINALIZADO | INDEPENDENCIA AV. 1998 | 1998 INDEPENDENCIA AV. |
3 | -58.512667 | -34.609169 | 4 | AGOSTO | 1 AL 6 | 4 | SIMBRON Y MARCOS PAZ | NaN | FINALIZADO | SIMBRON Y PAZ, MARCOS | SIMBRON & PAZ, MARCOS |
4 | -58.510953 | -34.609638 | 5 | AGOSTO | 1 AL 6 | 4 | TINOGASTA Y ZURICH | NaN | FINALIZADO | TINOGASTA Y ZURICH | TINOGASTA & ZURICH |
¿Cómo agregamos los puntos donde se encuentran las rampas?¶
- Debemos crear las geometrías para cada una de las rampas contenidas en el dataset de rampas_2016.
- Para eso importamos de la librería shapely.geometry las geometría POINT
from shapely.geometry import Point
geometry = gpd.points_from_xy(rampas_2016['X'], rampas_2016['Y'])
Vemos algunas de las geometrias creadas en el paso anterior.
geometry[:3]
<GeometryArray> [<shapely.geometry.point.Point object at 0x7f2d7a2bf820>, <shapely.geometry.point.Point object at 0x7f2d77f13370>, <shapely.geometry.point.Point object at 0x7f2d77f13340>] Length: 3, dtype: geometry
Ahora creamos el GeoDataFrame ...¶
En las siguientes líneas creamos el dataframe geografico asignandole los datos del dataframe de rampas_2016 y las geometrias creadas anteriormente.
rampas_2016_gdf = gpd.GeoDataFrame(rampas_2016,
crs='epsg:4326',
geometry=geometry)
rampas_2016_gdf.head()
X | Y | ID | MES | SEMANA | ZONA | CALLE | ALTURA | ESTADO | DOM_NORMA | DOM_GEO | geometry | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | -58.401517 | -34.613463 | 1 | AGOSTO | 1 AL 6 | 2 Y 3 | ALBERTI | 315.0 | FINALIZADO | ALBERTI 315 | 315 ALBERTI | POINT (-58.40152 -34.61346) |
1 | -58.403174 | -34.598833 | 2 | AGOSTO | 1 AL 6 | 2 Y 3 | CORDOBA AV | 2554.0 | FINALIZADO | CORDOBA AV. 2554 | 2554 CORDOBA AV. | POINT (-58.40317 -34.59883) |
2 | -58.394427 | -34.618371 | 3 | AGOSTO | 1 AL 6 | 2 Y 3 | INDEPENDENCIA AV | 1998.0 | FINALIZADO | INDEPENDENCIA AV. 1998 | 1998 INDEPENDENCIA AV. | POINT (-58.39443 -34.61837) |
3 | -58.512667 | -34.609169 | 4 | AGOSTO | 1 AL 6 | 4 | SIMBRON Y MARCOS PAZ | NaN | FINALIZADO | SIMBRON Y PAZ, MARCOS | SIMBRON & PAZ, MARCOS | POINT (-58.51267 -34.60917) |
4 | -58.510953 | -34.609638 | 5 | AGOSTO | 1 AL 6 | 4 | TINOGASTA Y ZURICH | NaN | FINALIZADO | TINOGASTA Y ZURICH | TINOGASTA & ZURICH | POINT (-58.51095 -34.60964) |
Pregunta: ¿cuáles son los estados de las rampas?¶
Nos fijamos que estados tienen las rampas y vemos que son FINALIZADO o EN EJECUCIÓN, esto nos servirá para poder representar en el mapa los puntos donde existe una rampa y diferenciarlos por su estado.
rampas_2016_gdf['ESTADO'].unique()
array(['FINALIZADO', 'EN EJECUCIÓN'], dtype=object)
El gráfico completo ¶
Generamos el mapa con las marcas correspondientes segun el estado.
fig, ax = plt.subplots(figsize = (15,15))
comunas.plot(ax = ax, color='beige', edgecolor='black')
for idx, row in comunas.iterrows():
plt.annotate(text=row['nombre_comuna'], xy=row['coords'], horizontalalignment='center', color='blue')
rampas_2016_gdf[rampas_2016_gdf['ESTADO']=='FINALIZADO'].plot(ax=ax, markersize=30, color='blue', marker='o', label='Finalizado')
rampas_2016_gdf[rampas_2016_gdf['ESTADO']=='EN EJECUCIÓN'].plot(ax=ax, markersize=30, color='red', marker='^', label='En Ejecución')
plt.legend(prop={'size': 15})
<matplotlib.legend.Legend at 0x7f2d77f7a620>
Desafío 3:¶
Modificar los colores y etiquetas del gráfico.
Desafío 4:¶
Generá otro gráfico donde sólo se muestre las rampas finalizadas
comunas.explore(style_kwds=dict(color="blue"), tooltip="BARRIOS")